package com.mantisframework.core.base.dao;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateTemplate;

/**
 * 功能：基础dao接口 作者：马东东 时间：2010-3-24
 * 
 * @param <T>
 */

 /**

 * 

 * @author 李奎和

 * <p>时间：2013-1-11 下午07:51:46 </p>

 * <p>电子邮件：likh@hwttnet.com </p>

 * @param <T>

 */
 
public interface IBaseDao<T> {

	/**
	 * 总记录数查询
	 * 
	 * @param T
	 *            pojo 实例对象
	 */
	public int getCount(T pojo);

	/**
	 * 记录数条件查询
	 * 
	 * @param T
	 *            pojo 实例对象
	 * @param String
	 *            condition 查询条件hql
	 */
	public int getCount(T pojo, String condition);

	/**
	 * 单条记录查询
	 * 
	 * @param Class
	 *            <T> clas 实例对象的class
	 * @param Serializable
	 *            id 实例对象的主键
	 */
	public T getById(Class<T> clas, Serializable id);

	/**
	 * 总页数获取
	* @param pojo
	* @param condition
	* @param numPerPage
	* @return
	*/
	public int getTotalPage(T pojo, String condition, int numPerPage);

	/**
	 * 总页数获取
	* @param condition
	* @param numPerPage
	* @return
	*/
	public int getTotalPage(String condition, int numPerPage);
	
	/**
	 * 单条记录查询
	 * 
	 * @param Class
	 *            <T> clas 实例对象的class
	 * @param conditon
	 *            查询条件
	 */
	public T getById(T pojo, String conditon);

	/**
	 * 查询所有记录(翻页)
	 * 
	 * @param T
	 *            pojo pojo实例
	 * @param int
	 *            startIndex 翻页参数:记录的起始位置
	 * @param int
	 *            pageSize 翻页参数:每次查询的记录数
	 */
	public List<T> getAll(T pojo, int startIndex, int pageSize);

	/**
	 * 查询所有记录(不翻页)
	 * 
	 * @param pojo
	 *            pojo实例
	 * @return
	 */
	public List<T> getAll(T pojo);

	/**
	 * 记录的条件查询
	 * 
	 * @param T
	 *            pojo pojo实例
	 * @param String
	 *            condition 查询条件hql
	 * @param int
	 *            startIndex 翻页参数:记录的起始位置
	 * @param int
	 *            pageSize 翻页参数:每次查询的记录数
	 */
	public List<T> getAll(T pojo, String condition, int startIndex, int pageSize);

	/**
	 * 
	 * 记录的条件查询
	 * 
	 * @param T
	 *            pojo pojo实例
	 * @param String
	 *            condition 查询条件hql
	 * @return
	 */
	public List<T> getAll(final T pojo, final String condition);

	/**
	 * 保存方法
	 * 
	 * @param T
	 *            pojo 保存实例对象
	 */
	public boolean save(T pojo);

	/**
	 * 保存或更新方法
	 * 
	 * @param T
	 *            pojo 操作实例对象
	 * @param Serializable
	 *            id 修改实例对象主键值
	 */
	public boolean saveOrUpdate(T pojo, Serializable id);

	/**
	 * 修改方法
	 * 
	 * @param T
	 *            pojo 修改实例对象
	 */
	public boolean modify(T pojo);

	/**
	 * 动态修改方法
	 * 
	 * @param T
	 *            pojo 修改实例对象
	 * @param Class
	 *            <T> cla 修改实例对象类
	 * @param Serializable
	 *            id 修改实例对象主键值
	 */
	public boolean modifyDynamic(T pojo, Serializable id);

	/**
	 * 删除方法
	 * 
	 * @param T
	 *            pojo 删除实例对象
	 */
	public boolean delete(T pojo);

	/**
	 * 不带结果集的Hibernate自由hql
	 * 
	 * @param String
	 *            hql
	 */
	public boolean query(String hql);

	/**
	 * 带结果集的Hibernate自由hql
	 * 
	 * @param String
	 *            hql
	 * @param int
	 *            startIndex 翻页参数:记录的起始位置
	 * @param int
	 *            pageSize 翻页参数:每次查询的记录数
	 */
	public List<?> query(String hql, int startIndex, int pageSize);

	/**
	 * 不带结果集的JDBC原生态自由sql
	 * 
	 * @param String
	 *            sql
	 */
	public boolean queryJDBCSql(String sql);

	/**
	 * 求总记录数
	 * 
	 * @param sql
	 * @return
	 */
	public int queryJDBCSqlCount(final String sql);

	/**
	 * 带结果集的JDBC原生态自由sql
	 * 
	 * @param String
	 *            sql
	 * @param Class
	 *            <?> instance 结果集需要封装到的实例(如果给null将封装到数组)
	 */
	public List<?> queryJDBCSql(String sql, Class<?> instance)
			throws SQLException, IllegalAccessException,
			InvocationTargetException, InstantiationException;

	/**
	 * 批量删除
	 * 
	 * @param T
	 *            pojo 实例对象
	 * @param Map
	 *            <String,Serializable[]> map 条件名值对集合
	 * @param int
	 *            andORor 集合元素之间的关系 0:and 1:or
	 * @param String
	 *            otherCondtion 其它条件hql
	 * @return int 返回删除成功的条数
	 */
	public int batchDelete(T pojo, Map<String, Serializable[]> map,
			int andORor, String otherCondtion);

	/**
	 * 批量更新
	 * 
	 * @param T
	 *            pojo 实例对象
	 * @param Map
	 *            <String,Serializable[]> map 条件名值对集合
	 * @param Map
	 *            <String,Serializable[]> map 更新字段（属性）名值对集合
	 * @param int
	 *            andORor 条件集合元素之间的关系 0:and 1:or
	 * @param String
	 *            otherCondtion 其它条件hql
	 * @return int 返回更新成功的条数
	 */
	public int batchModify(T pojo, Map<String, Serializable[]> keyMap,
			Map<String, Serializable> valueMap, int andORor,
			String otherCondtion);// 批量更新

	/** 动态更新元素 */
	public int modify(final String hql);

	/**
	 * 根据对应条件删除对象
	 * 
	 * @param pojo
	 * @param otherCondtion
	 * @return
	 */
	public int delete(T pojo, String otherCondtion);
	/**
	 * 通过hql删除对象
	 * @param hql
	 * @return
	 */
	public int execute(String hql);

	/**
	 * 获得session
	 */
	public Session getDaoSession();

	/**
	 * 获得HibernateTemplate
	 */
	public HibernateTemplate getDaoHibernateTemplate();

}
